package com.cdu.guoxinan.www.smartcom.tool;

import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.cdu.guoxinan.www.smartcom.config.OssProperties;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;

import java.io.InputStream;
import java.util.UUID;

@Component
public class OssUtil {
    @Autowired
    private OssProperties ossProperties;

    public String upload(MultipartFile file) throws Exception {
        OSS ossClient = new OSSClientBuilder().build(
            ossProperties.getEndpoint(),
            ossProperties.getAccessKeyId(),
            ossProperties.getAccessKeySecret()
        );
        String originalFilename = file.getOriginalFilename();
        String fileName = ossProperties.getDir() + UUID.randomUUID() + "_" + originalFilename;
        try (InputStream inputStream = file.getInputStream()) {
            ossClient.putObject(ossProperties.getBucketName(), fileName, inputStream);
        } finally {
            ossClient.shutdown();
        }
        // 返回图片的公网访问地址
        return "https://" + ossProperties.getBucketName() + "." +
                ossProperties.getEndpoint().replace("https://", "") + "/" + fileName;
    }

    /**
     * 更新文件（上传新文件并删除旧文件）
     * @param file 新文件
     * @param oldFileUrl 旧文件的URL
     * @return 新文件的URL
     */
    public String updateFile(MultipartFile file, String oldFileUrl) throws Exception {
        // 先上传新文件
        String newFileUrl = upload(file);

        // 如果旧文件存在，删除旧文件
        if (oldFileUrl != null && !oldFileUrl.trim().isEmpty()) {
            try {
                deleteFile(oldFileUrl);
            } catch (Exception e) {
                // 删除旧文件失败不影响新文件上传，只记录日志
                System.err.println("删除旧文件失败: " + e.getMessage());
            }
        }

        return newFileUrl;
    }

    /**
     * 从OSS URL中提取文件路径
     * @param url OSS文件的完整URL
     * @return 文件在OSS中的路径
     */
    public String extractFilePathFromUrl(String url) {
        if (url == null || url.trim().isEmpty()) {
            return null;
        }

        // 移除URL前缀，获取文件路径
        String prefix = "https://" + ossProperties.getBucketName() + "." +
                       ossProperties.getEndpoint().replace("https://", "") + "/";

        if (url.startsWith(prefix)) {
            return url.substring(prefix.length());
        }

        return null;
    }

    /**
     * 删除OSS中的文件
     * @param fileUrl 文件的完整URL
     * @return 是否删除成功
     */
    public boolean deleteFile(String fileUrl) {
        if (fileUrl == null || fileUrl.trim().isEmpty()) {
            return false;
        }

        String filePath = extractFilePathFromUrl(fileUrl);
        if (filePath == null) {
            return false;
        }

        OSS ossClient = new OSSClientBuilder().build(
            ossProperties.getEndpoint(),
            ossProperties.getAccessKeyId(),
            ossProperties.getAccessKeySecret()
        );

        try {
            // 检查文件是否存在
            boolean exists = ossClient.doesObjectExist(ossProperties.getBucketName(), filePath);
            if (!exists) {
                return true; // 文件不存在，认为删除成功
            }

            // 删除文件
            ossClient.deleteObject(ossProperties.getBucketName(), filePath);
            return true;
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        } finally {
            ossClient.shutdown();
        }
    }

    /**
     * 批量删除OSS中的文件
     * @param fileUrls 文件URL列表
     * @return 删除成功的文件数量
     */
    public int deleteFiles(String... fileUrls) {
        if (fileUrls == null || fileUrls.length == 0) {
            return 0;
        }

        OSS ossClient = new OSSClientBuilder().build(
            ossProperties.getEndpoint(),
            ossProperties.getAccessKeyId(),
            ossProperties.getAccessKeySecret()
        );
        int successCount = 0;
        try {
            for (String fileUrl : fileUrls) {
                if (fileUrl != null && !fileUrl.trim().isEmpty()) {
                    String filePath = extractFilePathFromUrl(fileUrl);
                    if (filePath != null) {
                        try {
                            // 检查文件是否存在
                            boolean exists = ossClient.doesObjectExist(ossProperties.getBucketName(), filePath);
                            if (exists) {
                                ossClient.deleteObject(ossProperties.getBucketName(), filePath);
                            }
                            successCount++;
                        } catch (Exception e) {
                            e.printStackTrace();
                            // 继续处理下一个文件
                        }
                    }
                }
            }
        } finally {
            ossClient.shutdown();
        }

        return successCount;
    }
}